package cn.seaboot.commons.net;

import cn.seaboot.commons.core.CommonUtils;
import cn.seaboot.commons.core.Converter;

import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.Map;

/**
 * 一些辅助函数
 *
 * @author Mr.css
 * @version 2024-03-01 11:43
 */
public class HttpUtils {
    private HttpUtils() {
    }

    /**
     * 一个逻辑更加简单的工具函数
     * <p>
     * {@link UriBuilder} 的下位替代函数，简化了很多校验操作，适用于大部分场景
     * <p>
     * 不适用场景：
     * 1、不支持带 fragment 的 uri（带井号的 url 地址）。
     * 2、存在同名参数，比如：参数 name 有两个不同的值。
     *
     * @param url     base url
     * @param map     request parameter(FormData)
     * @param charset user for: URLEncoder.encode(value, charset)
     * @return url will FormData
     * @throws UnsupportedEncodingException If the named encoding is not supported
     */
    public static String addMapToUrl(String url, Map<String, ?> map, String charset) throws UnsupportedEncodingException {
        if (CommonUtils.isNotEmpty(map)) {
            StringBuilder sb = new StringBuilder(url);
            if (url.indexOf('?') < 0) {
                sb.append('?');
            } else {
                char lst = url.charAt(url.length() - 1);
                if (lst != '&' && lst != '?') {
                    sb.append("&");
                }
            }
            for (Map.Entry<String, ?> entry : map.entrySet()) {
                String value = Converter.toString(entry.getValue());
                value = URLEncoder.encode(value, charset);
                sb.append(entry.getKey()).append("=").append(value).append('&');
            }
            sb.setLength(sb.length() - 1);
            return sb.toString();
        } else {
            return url;
        }
    }
}
